/* Run statically defined image through a
 * pytorch-traind MNIST character detection network.
 * This test is mostly a regression for BatchNorm optimizations.
 */ 
#include <stdio.h>
#include <math.h>

/* Entry to the neural network. (TODO: how about generating a header?) */
extern "C" {
void entry(float input[1][28*28], float output[1][10]);
}

/* make the window wide enough or the font small enough for some ascii art :) */
float input_seven [1][28*28] = {{
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,1.0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,1.0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,  0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,1.0,  0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,1.0,  0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,1.0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,1.0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,1.0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,1.0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,1.0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,1.0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,1.0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,1.0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,1.0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,1.0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,1.0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,1.0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,1.0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0 ,
  0,  0,  0,  0,  0,  0,  0,  0,  0,1.0,1.0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0 ,
}};

// Calculated with unoptimized BatchNorm
float results[10] = {
1.04808474, -1.25860775, -6.02781439, 2.02120113, 1.64859867, 4.39240599, -3.22019339, 4.72483015, -1.96882212, -0.978904724};

int main(void)
{
	float output_seven[1][10];
	entry(input_seven, output_seven);
	for(int i=0; i<10; i++ ){
		if( fabs(output_seven[0][i] - results[i]) > 1e-5 )
			return 1;
	}


	return 0;
}

